package com.cloud.thread;

/**
 * @Author tangyuan2meicloud.com
 * @DATE 2021/7/8 16:06
 * @Desc
 * @Remarks
 */

import java.util.concurrent.*;

/**
 * 线程池执行步骤：
 * 0，提交任务
 * 1.核心线程数是否还有空余，若有，创建核心线程执行任务
 * 2.阻塞队列是否有空间，有空间，加入到队列中
 * 3.当前线程未达到最大线程数，创建临时线程执行任务
 * 4.前面都无法通过，执行拒绝策略
 *
 * 针对线程池的submit和execute的方法区别，主要是：
 * submit方法有几个重载方法，可以执行Runnable和Callable任务
 * execute是针对于一般的Runnable方法，无返回值
 * submit方法提交Runnable任务相当于创建了一个FutureTask<Void>任务，可以达到阻塞线程的目的 类似于 join()
 *
 */
public class ThreadPoolDemo {

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(3);

        Runnable task = ()->{
                System.out.println("任务开始！");
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
        };

//        Callable<Integer> task=()->{
//            int sum = 0;
//            for (int i = 1; i <= 100; i++) {
//                sum += i;
//            }
//            return sum;
//        };

//        executorService.execute(task);
        Future<?> submit = executorService.submit(task);
        try {
            System.out.println(submit.get());
            System.out.println("11111111111");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

        executorService.shutdown();
    }

}
